﻿using System;
using System.Collections.Generic;
using System.Data;
using System.Data.SQLite;
using System.Windows.Forms;
using Excel = Microsoft.Office.Interop.Excel;

namespace lp1415_11951_TP2.model
{
    internal class CriarBaseDados
    {
        private Excel.Application xlApp;
        private Excel.Range range;
        private Excel.Workbook xlWorkBook;
        private Excel.Worksheet xlWorkSheet;
        private static SQLiteConnection m_dbConnection;

        private SQLiteCommand cmd;

        private List<double> valoresCell = new List<double>();

        public CriarBaseDados(string path)
        {
            LerFicheiroExcel ler = new LerFicheiroExcel();
            xlWorkSheet = ler.lerFicheiro(path);

        }

        public void criaBaseDados()
        {
            //criacao da base de dados e conexao a mesma
            SQLiteConnection.CreateFile("IPC_Base.db");

            m_dbConnection = new SQLiteConnection("Data Source=IPC_Base.db;Version=3;");
            //Abrir conexão
            m_dbConnection.Open();


            ////comando para ações na base de dados
            cmd = m_dbConnection.CreateCommand();

            //SQLiteDataAdapter db = new SQLiteDataAdapter("SELECT * FROM IPC_Base", m_dbConnection);
            //DataSet ds = new DataSet();

            //db.Fill(ds, "ipc_global");

            

            //criar tabela
            cmd.CommandText = "CREATE TABLE IPC_Portugal " +
                              "(ano integer," +
                              "ipc_global real," +
                              "variacao_anual real," +
                              "remuneracao_min real," +
                              "remuneracao_max real," +
                              "pib real," +
                              "rendim_nacional real," +
                              "rendim_disp real," +
                              "remuneracoes_percapita real)";
            cmd.ExecuteNonQuery();

            //Faz a leitura das celulas
            range = xlWorkSheet.UsedRange;

            for (int i = 2; i <= 38; i++)
            {
                for (int j = 2; j <= 10; j++)
                {
                    //se o valor for null é adicionado zero na lista
                    if ((((range.Cells[i, j] as Excel.Range).Value2) == null) || (((range.Cells[i, j] as Excel.Range).Value2) < 0))
                    {
                        valoresCell.Add(0.0);
                    }
                    else
                    {
                        //caso seja double é formatado o valor  para duas casas decimais
                        double range_values = (double) (range.Cells[i, j] as Excel.Range).Value2;
                        double m = Math.Round(range_values, 1);
                        valoresCell.Add(m);
                    }

                }

                string values = string.Join(";", valoresCell.ToArray());

                // insere os dados
                cmd.CommandText = "INSERT INTO IPC_Portugal (" +
                                  "ano, ipc_global," +
                                  "variacao_anual," +
                                  "remuneracao_min," +
                                  "remuneracao_max," +
                                  "pib, rendim_nacional," +
                                  "rendim_disp," +
                                  "remuneracoes_percapita)" +
                                  "VALUES (@ano, @ipc_global," +
                                  "@variacao_anual,@remuneracao_min," +
                                  " @remuneracao_max, @pib,@rendim_nacional," +
                                  " @rendim_disp, @remuneracoes_percapita);";

                cmd.Parameters.AddWithValue("@ano", valoresCell[0]);
                cmd.Parameters.AddWithValue("@ipc_global", valoresCell[1]);
                cmd.Parameters.AddWithValue("@variacao_anual", valoresCell[2]);
                cmd.Parameters.AddWithValue("@remuneracao_min", valoresCell[3]);
                cmd.Parameters.AddWithValue("@remuneracao_max", valoresCell[4]);
                cmd.Parameters.AddWithValue("@pib", valoresCell[5]);
                cmd.Parameters.AddWithValue("@rendim_nacional", valoresCell[6]);
                cmd.Parameters.AddWithValue("@rendim_disp", valoresCell[7]);
                cmd.Parameters.AddWithValue("@remuneracoes_percapita", valoresCell[8]);

                //executa a inserção.
                cmd.ExecuteNonQuery();

                //limpar a lista a cada iteração.
                valoresCell.Clear();

            }
            MessageBox.Show("Base de dados gerada com sucesso!");
        }

        //Fecha o ficheiro e a conexão com a base de dados.
        public void fechaConexao()
        {
            xlWorkBook.Close(0);
            xlApp.Quit();
            m_dbConnection.Close();
        }
    }
}
